-- 基于滑动窗口限流 Lua 脚本
-- 限流对象
local key = KEYS[1]
-- 阈值
local limit = tonumber(ARGV[1])

-- 窗口大小 毫秒
local windowSize = tonumber(ARGV[2])
local nowTs = tonumber(ARGV[3])


-- redis.call('TIME') 一个包含两个元素的数组，分别代表秒和毫秒
--local currentTimestamp = tonumber(redis.call('TIME')[1]) * 1000 + tonumber(redis.call('TIME')[2])
--local currentTimestamp = tonumber(redis.call('TIME')[1])

-- 计算窗口外的时间节点（过期的时间节点）
local windowStartTimestamp = nowTs - windowSize
-- 移除已过期的
redis.call('ZREMRANGEBYSCORE', key, '-inf', windowStartTimestamp)

-- 获取窗口内请求数量
local count = redis.call('ZCARD', key)

-- 判断是否超过限流阈值
if count >= limit then
    -- 0 限流
    return 0
else
    -- 添加当前时间戳
    redis.call('ZADD', key, nowTs, nowTs)
    -- 1 不限流
    return 1
end
